// 定义图的数据结构（邻接表形式）
Graph {
    vertices: 节点数组，每个元素代表一个节点，包含指向其邻接节点链表的指针
    vertexCount: 图中节点的数量
}

// 定义邻接表中节点（边节点）的数据结构
AdjNode {
    vertexIndex: 邻接节点的索引
    next: 指向下一个邻接节点的指针
}

// 广度优先搜索求最短路径（以节点数量衡量）函数
function bfsShortestPath(Graph graph, int startVertex, int endVertex):
    // 创建访问标记数组，初始化为false，表示所有节点都未被访问
    visited[graph.vertexCount] = false
    // 创建前驱节点数组，初始值设为 -1，表示无前驱
    prev[graph.vertexCount] = -1
    // 创建队列用于BFS
    queue = createQueue()
    // 将起始节点标记为已访问并加入队列
    visited[startVertex] = true
    enqueue(queue, startVertex)
    
    while (queue 不为空):
        // 取出队列头部的节点
        currentVertex = dequeue(queue)
        // 如果当前节点就是目标节点，构建并返回最短路径
        if (currentVertex == endVertex):
            path = []
            node = endVertex
            while (node!= -1):
                path.append(node)
                node = prev[node]
            return reverse(path)
        
        // 获取当前节点的邻接节点链表头指针
        adjNode = graph.vertices[currentVertex].firstAdjNode
        while (adjNode!= null):
            adjacentVertex = adjNode.vertexIndex
            // 如果邻接节点未被访问
            if (not visited[adjacentVertex]):
                // 标记为已访问
                visited[adjacentVertex] = true
                // 设置其前驱节点为当前节点
                prev[adjacentVertex] = currentVertex
                // 将邻接节点加入队列
                enqueue(queue, adjacentVertex)
            adjNode = adjNode.next
    // 如果未找到路径，返回 null
    return null